package com.zjsru.plan2023.oneday.oneDay202301;

/**
 * @Author: CookLee
 * @Date: 2023/1/31
 *
 * 判断矩阵是否是一个 X 矩阵：矩阵对角线上的所有元素都 不是 0，矩阵中所有其他元素都是0
 *
 * 输入：grid = [[2,0,0,1],[0,3,1,0],[0,5,2,0],[4,0,0,2]]
 * 输出：true
 * 解释：
 * X 矩阵应该满足：绿色元素（对角线上）都不是 0 ，红色元素都是 0 。
 * 因此，grid 是一个 X 矩阵。
 *
 * 输入：grid = [[5,7,0],[0,3,1],[0,5,0]]
 * 输出：false
 * 解释：矩阵如上图所示。
 * X 矩阵应该满足：绿色元素（对角线上）都不是 0 ，红色元素都是 0 。
 * 因此，grid 不是一个 X 矩阵。
 *
 *
 */
public class CheckXMatrix {
    
    /**
     * 模拟
     *
     * @param grid 网格
     * @return boolean
     */
    public boolean checkXMatrix(int[][] grid) {
        boolean valid = true;
        for (int i = 0; i < grid.length; i++) {
            int[] nums = grid[i];
            valid = this.helper(nums, i);
            //只要一层的校验没过，跳出循环
            if (!valid) {
                break;
            }
        }
        return valid;
    }
    
    /**
     * 判断助手类
     *
     * @param nums 一维数组
     * @param tag  标记，记录处于第几层
     * @return boolean
     */
    private boolean helper(int[] nums, int tag) {
        //记录对角线的数字是否符合要求
        boolean flag = true;
        //记录其他位置的数字是否符合要求
        boolean flag2 = true;
        for (int i = 0; i < nums.length; i++) {
            int reverseNum = nums.length - 1 - tag;
            //校验每层对角线数字
            if (tag == i || reverseNum == i) {
                //从左边开始
                if (nums[tag] == 0) {
                    flag = false;
                    
                }
                //从右边开始
                if (nums[reverseNum] == 0) {
                    flag = false;
                }
            } else {
                //校验其他位置
                flag2 = (nums[i] == 0);
                if (!flag2) {
                    break;
                }
            }
            
        }
        return flag && flag2;
    }
    
    
    /**
     * 数学
     *
     * @param grid 网格
     * @return boolean
     */
    public boolean checkXMatrix2(int[][] grid) {
        int n = grid.length;
        for (int i = 0; i < n; ++i) {
            for (int j = 0; j < n; ++j) {
                //满足 i=j或者 i+j+1=n，则说明该点在矩阵 grid的对角线
                if (i == j || (i + j) == (n - 1)) {
                    if (grid[i][j] == 0) {
                        return false;
                    }
                } else if (grid[i][j] != 0) {
                    return false;
                }
            }
        }
        return true;
    }
    
    public static void main(String[] args) {
        CheckXMatrix checkXMatrix = new CheckXMatrix();
//        int[][] gird = new int[][] {{2, 0, 0, 1}, {0, 3, 1, 0}, {0, 5, 2, 0}, {4, 0, 0, 2}};
//        int[][] gird = new int[][] {{0,0,0,0,1},{0,4,0,1,0},{0,0,5,0,0},{0,5,0,2,0},{4,0,0,0,2}};
        int[][] gird = new int[][] {{6,0,0,2},{0,5,15,0},{9,5,4,0},{8,0,0,20}};
        System.out.println(checkXMatrix.checkXMatrix(gird));
    }
}
